/*Copyright (C) 2009 - 2011 MASSART GAUTHIER and Careil Baptiste

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef UTILITAIRES_HEADER
#define UTILITAIRES_HEADER

/*
** Permet de compter le nombre d'occurence de key dans cs
**
** \parm cs Une chaine de caractère se terminant par '\0'
** \parm key Un caractère qui sera cherché dans cs
**
** \ret Le nombre d'occurence de key dans cs.
*/
int str_count(const char *cs, const char key);

/*
** Permet d'afficher d'un certain nombre d'espaces
**
** \param nbEspace Le nombre d'espace à afficher
*/
void indenter_espace(short nb_espaces);

/*
** Permet d'indenter un texte
**
** \param cs La chaine à indenter
** \param nbSpace Le nombre d'espace nécessaire à l'identation
** \param indenterAprès Indique si le même nombre d'espaces doit être
** rajouter une fois la chaine affichée
*/
void indenter(const char *cs, short nb_espaces, bool indenter_apres);

/*
** Permet d'afficher centrer la chaine cs (n'ajoute pas de retour
** à la ligne '\n'). Attention, un retour à la ligne
** en milieu de chaine ne sera pas identé.
**
** \param cs La chaine de caractère à centrer
** \ret Le nombre d'espaces dont a été identé la chaine
*/
int afficher_centre(const char *cs);

void afficher_barre_son(void);

void actualiser_barre_son(void);

/*
** Permet d'afficher le titre titre. Attention cette chaine ne doit
** pas comporter de retour à la ligne!
**
** \parm titre Le titre à afficher.
*/
void afficher_titre(const char *titre);

void souligner_centre(short longueur_soulignage);

/*
** Permet d'afficher le menu "recommencer?" à la fin d'un jeu.
**
** \ret false si le joueur à choisis de retourner au menu, true
** s'il a choisit de recommencer.
*/
int afficher_menu_recommencer(const char *contenu_titre);

/*
** Permet de demander le nom du joueur
**
** Permet de demander le nom au joueur n°player_number. Le nom entré
** sera stocké dans player_name de longueur MAX_PLAYER_NAME_LENGHT.
**
** \parm player_number Le numéro du joueur auquel demander le nom. Si
** nulle, le numéro du joueur ne sera pas spécifié.
** \parm player_name Une chaine de caractère où sera stockée le nom.
*/
void get_player_name(short player_number, char player_name[]);

/*
** Permet de remplir une ligne de ' '. Cette fonction va en début de
** ligne avant de commencer le remplissage. Elle retourne en début de
** ligne une fois le remplissage terminé.
*/
void clear_line();

/*
** Permet la suppression des retour chariots, new line, clear line
** de la chaine str.
**
** \parm str La chaine où enlever les caractères de fin de ligne
*/
void remove_ret_line(char *str);

/*
** Permet de demander une confirmation. Cette fonction utilise
** afficher_menu avec comme argument :
** contenu_menu = "Oui\nNon\n"
** titre_menu = "Êtes-vous sûr de vouloir "<keyword>"?"
** titre_jeu = <title>
**
** \param keyword La chaine à afficher dans le titre du menu
**                (cf ci-dessus)
** \param title   Le titre du menu (cf ci-dessus)
** \return true   Si l'utilisateur confirme (choix 'Oui')
** \return false  Si l'utilisateur annule (choix 'Non')
*/
bool confirm_str(const char *keyword, const char *title);

/*
** Permet d'afficher la touche passée en paramètre
** sur une seule case.
**
** \param touche La touche à afficher
*/
void afficher_touche(short touche);

/*
** Concatène `line' dans l'entrée menu `entry'
** `line' ne doit pas comporter de retour chariot.
** `entry' sera réalloué à la taille nécessaire.
**
** \param entry L'entrée menu où ajouter la ligne.
** \param line  La ligne à ajouter à l'entrée menu.
*/
void cat_line_in_entry(char **entry, const char *line);

/*
** Libère la mémoire allouée sur le pointeur `ptr'. Si
** `ptr == NULL', il n'est pas libéré. `ptr' vaut `NULL'
** après l'appelle à cette fonction.
**
** \param ptr Le pointeur à libérer.
*/
# define mfree(ptr) if (ptr != NULL) { free(ptr); ptr = NULL; }

/*
** Permet de tirer un nombre au sort compris entre min et max
** inclus.
** \param  max La valeur maximale de retour
** \param  min La valeur minimale de retour
** \return Une valeur aléatoire comprise entre min et max inclus
*/
# define random(min, max) (rand() % (max - min + 1)) + min

# define x_begin_center(taille) (DEFAULT_SCREEN_SIZE_X - taille) / 2

#ifndef __FreeBSD__
int strlcpy(char *dest, const char *src, int size);
#endif
void *xmalloc(unsigned int size);
int count_word(const char *str, short result, const char *c);
void swt_fill(char **tab, const char *str, int idx, const char *c);
char **split(const char *separators, const char *str);
void unsplit(char **tableau);

/*
**Remplace la fonction strlen_utf8 qui ne supporte pas les caractère UTF-8
*/
int strlen_utf8(const char *s);

#endif
